package com.code.soulspringboot.handler;

import com.code.soulspringboot.code.BizResponseCode;
import com.code.soulspringboot.exception.BaseException;
import lombok.extern.slf4j.Slf4j;

import java.util.function.Function;

/**
 * 处理方式一：这里统一处理，controller需要调用此方法
 * 处理方式二：使用spring Boot提供的统一异常处理方式
 * 对于我们使用各种断言抛出的异常，我们这里统一对其进行处理
 * @author lyf
 * @date 2022-11-20 22:46
 */
@Slf4j
public class ResponseProcessor {

    /**
     * 方法使用泛型，需要在返回值前面把类型定义出来
     * 这里入参是 T ，返回值类型是 R
     * @param request 入参
     * @param function 具体的处理方法，有入参类型和返回值类型
     * @return
     * @param <T>
     * @param <R>
     */
    public static <T, R> BaseResponse<R> handle(T request, Function<T, R> function) {
        BaseResponse<R> response = new BaseResponse<>();
        try {
            // todo 做入参各种判断等
            R data = function.apply(request);
            response.setData(data);
            if (response.getCode() == null) {
                response.setCode(BizResponseCode.SUCCESS.getCode());
            }
            if (response.getMsg() == null) {
                response.setMsg(BizResponseCode.SUCCESS.getMsg());
            }
            return response;
        } catch (BaseException e) {
            log.error(e.toString(), e);
            response.setCode(e.getErrorCode().getCode());
            response.setMsg(e.getErrorMsg());
        } catch (Throwable e) {
            log.error(e.toString(), e);
            response.setCode(BizResponseCode.SYS_ERROR.getCode());
            response.setMsg(BizResponseCode.SYS_ERROR.getMsg());
        } finally {
            // todo 想结束也可以写...
        }

        return response;
    }
}
